package concurrent;

import design.One.Person;
import design.One.Woman;
import org.junit.Test;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 深拷贝的方法
 */
public class DeelpCopy {
    @Test
    public void test() throws IOException, ClassNotFoundException {
        List<Woman> personList = new ArrayList<>();
        personList.add(new Woman(1, "yht"));
        personList.add(new Woman(2, "爸爸"));
        personList.add(new Woman(3, "呵呵"));
        personList.add(new Woman(4, "哈哈"));

        List<Woman> personList1 = deepCopy(personList);
        System.out.println(personList1);
        personList.get(0).setName("hhhhhhhhhhhhhhhhhhhhhhhhh");
        System.out.println(personList1);


    }

    /**
     * 对象深拷贝：
     *     Java对对象和基本的数据类型的处理是不一样的。在Java中用对象的作为入口参数的传递则缺省为”引用传递”，也就是说仅仅传递了对象的一个”引用”，
     *     这个”引用”的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时，实质上就是在对这个对象的直接操作。
     */
    public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(byteOut);
        out.writeObject(src);

        ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
        ObjectInputStream in = new ObjectInputStream(byteIn);
        List<T> dest = (List<T>) in.readObject();
        return dest;
    }




}
